const {ccclass, property} = cc._decorator;

@ccclass
export default class Q2 extends cc.Component {

    @property(cc.EditBox)
    editBoxA: cc.EditBox = null;

    @property(cc.EditBox)
    editBoxB: cc.EditBox = null;

    @property(cc.EditBox)
    editBoxV: cc.EditBox = null;

    @property(cc.Label)
    retLabel: cc.Label = null;

    /**
     * 方法1：直接遍历数组a、b。假设数组a长度m，数组b长度n，则时间复杂度为O(m*n)。
     * 
     */
    isSumInArrays_1(a: number[], b: number[], v: number) : boolean {
        for (let i = 0; i < a.length; i++) {
            for (let j = 0; j < b.length; j++) {
                if (a[i] + b[j] === v) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * 方法2：先使用Set数据结构保存数组a，然后遍历数组b。由于set.has()方法的时间复杂度为O(1)
     *      所以：假设数组a长度m，数组b长度n，整体的时间复杂度为O(m+n)。
     * 
     */
    isSumInArrays_2(a: number[], b: number[], v: number) : boolean {
        let setA: Set<number> = new Set(a);
        for (let i = 0; i < b.length; i++) {
            if (setA.has(v - b[i])) {
                return true;
            }
        }

        return false;
    }

    // 字符串转换成数组，测试用
    parseStr2IntArray (str: string) : number[] {
        let strArr: string[] = str.split(',');
        let intArr: number[] = strArr.map(numStr => parseInt(numStr.trim()));

        return intArr;
    }

    onCheckBtnClick() {
        let aStr: string = this.editBoxA.string;
        let bStr: string = this.editBoxB.string;
        let vStr: string = this.editBoxV.string;

        let a: number[] = this.parseStr2IntArray(aStr);
        let b: number[] = this.parseStr2IntArray(bStr);
        let v: number = parseInt(vStr.trim());

        // 此处应该对输入做检查，略

        let result: boolean = this.isSumInArrays_2(a, b, v);
        if (result) {
            this.retLabel.string = 'true';
            this.retLabel.node.color = cc.Color.GREEN;
        } else {
            this.retLabel.string = 'false';
            this.retLabel.node.color = cc.Color.RED;
        }
    }

}
